package cn.tedu.demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component //把一个类标记成 Spring 容器所管理的组件
public class Person {
//    @Autowired//自动装配
//    private Shirt shirt;
//    @Autowired
//    private Sweater sweater;
    /*
    实际开发中，我们定义需要用到的依赖时，往往都是以接口形式定义（面向接口）
    相当于人类的自然表达：我出门应当是穿件“衣服”即可。

    Spring容器自动装配时，如果当前属性类型是一个接口，容器会寻找其管理的对象中
    没有接口的实现类，如果有则进行注入动作，如果找到多个，则会报错
     */
    @Autowired
    @Qualifier("winter")//引用某个对象的注解，通过@Component设置名字，然后调用
    private Clothes clothes;
    public void play(){
        //穿上衣服出去玩
        /*
        Person的play方法执行过程中需要使用到Shirt的wear方法完成某些逻辑
        这意味着Person类需要【依赖]Shirt

        原本我们写代码，当我们需要使用一个类时，我们会实例化，该操作又带来了
        硬编码，如果后期需要使用其他类(不再使用Shirt),这里还要修改代码
        在Spring容器中的建议:
        如果当前类受容器管理，那么这个类如果还依赖其他类时，应当将依赖的类作为
        [属性]定义，并由容器将需要使用的类设置到属性上供其使用
        这种模式称为：依赖，注入
        依赖：当前类需要使用这个类来完成他的工作，Shirt就是当前Person类所依赖的类
        注入：将依赖的对象通过当前类的属性由容器将其传递进来，这个动作成为注入
        */
        //Shirt shirt = new Shirt();让shirt变为属性
        //shirt.wear()；
        clothes.wear();
        System.out.println("出去玩");
    }
}
